package reflect;

import org.junit.Test;

import java.lang.reflect.Method;

public class MethodDemo {

    @Test
    public void test2() throws Exception {
//        getDeclaredMethods 获取自己的所有的方法
//        获取单个方法

        Class c = Class.forName("reflect.Person");

        Method[] methods = c.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

        System.out.println("---------------");

//        getDeclaredMethod:在getDeclaredMethods范围内获取一个方法对象
        // getDeclaredMethod(String name, Class<?>... parameterTypes)
        // name方法名, 可变参数是形参class对象
        Method m1 = c.getDeclaredMethod("playGame");
        m1.setAccessible(true);

        // 调用方法
        // 需要一个对象
        Person person = (Person) c.getConstructor().newInstance();
        // invoke(Object obj, Object... args) 调用方法
        m1.invoke(person);


    }


    @Test
    public void test1() throws Exception {
//        getMethods 获取自己的包括父类所有的public方法
        Class c = Class.forName("reflect.Person");

        Method[] methods = c.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("---------------");

//        getMethod: 在getMethods范围内获取一个方法对象
        // getMethod(String name, Class<?>... parameterTypes)
        // name方法名, 可变参数是形参class对象
        Method m1 = c.getMethod("eat", String.class);

        // 调用方法
        // 需要一个对象
        Person person = (Person) c.getConstructor().newInstance();
        // invoke(Object obj, Object... args) 调用方法
        m1.invoke(person, "红烧肉");



    }
}
